package com.hong.spring.aop.interceptor;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import java.util.Arrays;
import java.util.List;

/**
 * @Auther: csh
 * @Date: 2020/7/14 16:33
 * @Description:拦截器
 */
public class LogInterceptor {
    /**
     *
     * 功能描述:前置通知
     *
     * @param:
     * @return:
     * @auther: csh
     * @date: 2020/7/14 16:33
     */
    public void beforeExecute(JoinPoint joinPoint){
        String methodName = joinPoint.getSignature().getName();
        List <Object> objects = Arrays.asList(joinPoint.getArgs());
        System.out.println(this.getClass().getSimpleName()+"前置拦截");
    }


    /**
     * 后置通知：在方法执行后执行的代码(无论该方法是否发生异常),注意后置通知拿不到执行的结果
     * @param joinPoint
     */
    public void afterExecute(JoinPoint joinPoint){

        String methodName = joinPoint.getSignature().getName();
        System.out.println("方法名称："+methodName+this.getClass().getSimpleName()+" after execute");
    }

    /**
     *
     * 功能描述:后置返回通知：在方法正常执行后执行的代码,可以获取到方法的返回值
     *
     * @param:
     * @return:
     * @auther: csh
     * @date: 2020/7/14 16:35
     */
    public void afterReturning(JoinPoint joinPoint, Object result){
        String methodName = joinPoint.getSignature().getName();
        System.out.println("方法名称"+methodName+this.getClass().getSimpleName()+" 后置拦截, 返回值:"+result);
    }
    /**
     *
     * 功能描述:后置异常通知：在方法抛出异常之后执行，可以访问到异常信息，且可以指定出现特定异常信息时执行代码
     *
     * @param:
     * @return:
     * @auther: csh
     * @date: 2020/7/14 16:38
     */
    public void afterThrowing(JoinPoint joinPoint,Exception exception){
        String methodName = joinPoint.getSignature().getName();
        System.out.println("异常方法:"+methodName+this.getClass().getSimpleName()+"后置异常通知，异常："+ exception);
    }

    /**
     *
     * 功能描述: 环绕通知, 围绕着方法执行
     *
     * @param:
     * @return: 
     * @auther: csh
     * @date: 2020/7/14 16:39
     */
    public Object around(ProceedingJoinPoint joinPoint){

        String methodName = joinPoint.getSignature().getName();
        System.out.println("环绕方法:"+methodName+this.getClass().getSimpleName()+" 环绕拦截开始");

        Object result = null;
        try {
            //执行目标方法
            result = joinPoint.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return result;
    }



}
